package com.zys.http.processor.basic;

import com.intellij.psi.PsiElement;
import jdk.jfr.Description;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Set;

/**
 * @author zys
 * @since 2025-01-20
 */
public interface PostmanProcessor {
    /**
     * @param element    PsiClass or KtClass
     * @param modulePath 模块路径
     * @return 单个 controller 能创建的所有节点
     */
    List<PostmanItem> postmanControllerItems(PsiElement element, String modulePath);

    /**
     * @param element        PsiMethod or KtNamedFunction
     * @param modulePath     模块路径
     * @param controllerPath 类路径
     * @return 单个方法能创建的所有节点
     */
    List<PostmanItem> postmanMethodItems(PsiElement element, String modulePath, String controllerPath);

    /**
     * @param element PsiMethod or KtNamedFunction
     * @param item    不能为 null, 通过 postmanItemCreate 创建的基础数据对象
     */
    void postmanItemPropertyCompletion(PsiElement element, PostmanItem item);

    default PostmanItem postmanItemCreate(String name, String method, String uri) {
        return new PostmanItem(name, method, uri);
    }

    /**
     * @author zys
     * @since 2023-09-23
     */
    @Data
    @NoArgsConstructor
    @Description("Velocity 模板渲染请求方式节点数据模型")
    class PostmanItem {
        @Description("请求名字")
        private String name;

        @Description("请求方式")
        private String method;

        @Description("请求类型")
        private String contentType;

        @Description("请求 uri")
        private String uri;

        @Description("请求体类型, raw、urlencoded")
        private String mode;

        @Description("请求体类型为 raw 时自动转换默认 json")
        private String raw;

        @Description("请求 url 参数 Key")
        private List<String> queryKey;

        @Description("请求 url urlencoded 参数 Key")
        private Set<String> urlencodedKey;

        protected PostmanItem(String name, String method, String uri) {
            this.name = name;
            this.method = method;
            this.uri = uri;
        }

    }
}
